package web.operator;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import web.annotation.Column;
import web.annotation.Entity;
import web.annotation.Key;
import web.clazz.Clazz;
import web.util.Log;

/**用于处理Entity注解，通过方法{@link #loadClass}将Entity信息存到{@link #Sets}中.
 * @author 乐渊
 * @version 1.0
 * @see ClassScanner
 * @see Clazz
 * */
public class EntityOperator extends ClassOperator{
	
	public static Set<Clazz> Entities;
	
	public EntityOperator(){
		if(Sets == null || Sets.size() < 1){
			new Log().setLog("实体类扫描失败!");
			return;
		}
		Entities = loadClass(Sets);
	}
	/**加载所有含注解标签的Entity
	 * @param SetClazz
	 * @return sets
	 * */
	private Set<Clazz> loadClass(Set<Clazz> SetClazz) {
		Set<Clazz> sets = new HashSet<>();
		SetClazz.forEach(clazz ->{
			
			//获取实体注解
			/*Annotation[] annClazz = clazz.getClazz().getAnnotations();旧写法，详见TypeOperator类*/
			@SuppressWarnings("unchecked")
			Entity entity = (Entity) clazz.getClazz().getAnnotation(Entity.class);
			
			
			//判断是否是Entity注解过的实体
			if(entity != null){
				//存放实体成员变量、表的普通列名
				Map<Field,String> mapFieldName = new HashMap<Field,String>();
				//存放实体成员变量、表的主键列名
				Map<String,String> mapKey = new HashMap<String,String>();
				
				//设置实体别名，为空则使用实体类名的小写作为表名
				if("".equals(entity.value())){
					String cn = clazz.getClazz().getName();
					cn = cn.substring(cn.lastIndexOf(".")+1, cn.length()).toLowerCase();
					clazz.setName(cn);
				}else
					clazz.setName(entity.value());
				
				//获取实体所有成员对象
				Field[] fields = clazz.getClazz().getDeclaredFields();
				List<Field> listFields = Arrays.asList(fields);
				
				listFields.forEach(field ->{
					//获取实体成员对象注解
					Key key = field.getAnnotation(Key.class);
					Column column = field.getAnnotation(Column.class);
					//判断注解类型 是主键还是普通列
					if(key != null){
						//获取主键名 为空默认为实体成员变量名
						if("".equals(key.value()))
							mapKey.put(field.getName(),field.getName());
						else
							mapKey.put(field.getName(),key.value());
						//判断是否自增  true为自增 false为非自增
						if(key.isAutoIncrease())
							clazz.setKeyAuto(true);
						else
							clazz.setKeyAuto(false);
							
					}else if(column != null){//同上
						if("".equals(column.value()))
							mapFieldName.put(field, field.getName());
						else
							mapFieldName.put(field, column.value());
					}else{
						//没有注解的实体成员默认为与列名同名
						mapFieldName.put(field, field.getName());
					}
				});
				clazz.setKey(mapKey);
				clazz.setFields(mapFieldName);
				sets.add(clazz);
			}
		});
		//释放全局set，用于指向新的set
		//Sets.clear();
		
		return sets;
	}
}
